package br.boicotando.server;

import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import br.boicotando.dominio.Boleto;


public class BoletoParser {
	private URL documento;


	public BoletoParser(URL url) throws IOException {
		documento = url;
	}

	private Boleto bindBoleto(NamedNodeMap attrs) {
		String attr;
		String value;
		Boleto boleto = new Boleto();
		for (int i = 0; (i < attrs.getLength()); ++i) {
			attr = attrs.item(i).getNodeName();
			value = attrs.item(i).getNodeValue();
			if (attr.equals("id")) {
				boleto.setId(value);
			} else if (attr.equals("cedente")) {
				boleto.setCedente(value);
			} else if (attr.equals("agencia_cedente")) {
				boleto.setAgenciaCedente(value);
			} else if (attr.equals("conta_cedente")) {
				boleto.setContaCedente(value);
			} else if (attr.equals("nome_sacado")) {
				boleto.setNomeSacado(value);
			} else if (attr.equals("cpf_sacado")) {
				boleto.setCpfSacado(value);
			} else if (attr.equals("endereco_sacado")) {
				boleto.setEnderecoSacado(value);
			} else if (attr.equals("valor_documento")) {
				boleto.setValorDocumento(Float.valueOf(value));
			} else if (attr.equals("data_vencimento")) {
				boleto.setDataVencimento(value);
			} else if (attr.equals("local_pagamento")) {
				boleto.setLocalPagamento(value);
			} else if (attr.equals("data_documento")) {
				boleto.setDataDocumento(value);
			} else if (attr.equals("codigo_banco")) {
				boleto.setCodigoBanco(value);
			} else if (attr.equals("codigo_carteira")) {
				boleto.setCodigoCarteira(value);
			} else if (attr.equals("instrucoes")) {
				boleto.setInstrucoes(value);
			}
		}
		return boleto;
	}

	private void bind( List<Boleto> envioBoleto, Node node) {
		int type = node.getNodeType();
		switch (type) {
			case Node.DOCUMENT_NODE: {
				bind(envioBoleto, ((Document) node).getDocumentElement());
				break;
			}
			case Node.ELEMENT_NODE: {
				NamedNodeMap attrs = node.getAttributes();
				if (node.getNodeName().equals("boleto")) {
					Boleto boleto = bindBoleto(attrs);
					envioBoleto.add(boleto);
				}
				if (node.hasChildNodes()) {
					NodeList children = node.getChildNodes();
					for (int i = 0; i < children.getLength(); i++) {
						bind(envioBoleto, children.item(i));
					}
				}
				break;
			}
		}
	}

	public List<Boleto> parse() throws Exception {
		List<Boleto> boletoPagamento = new ArrayList<Boleto>();
		DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
		docBuilderFactory.setIgnoringElementContentWhitespace(true);
		DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
		Document doc = docBuilder.parse(documento.openConnection().getInputStream());
		bind(boletoPagamento, doc);
		return boletoPagamento;
	}
}
